package com.xj.algorithm.leetcode;

import java.util.HashMap;
import java.util.Map;

/**
 * 快乐数
 */
public class L202_快乐数 {

    /**
     * 编写一个算法来判断一个数是不是“快乐数”。
     *
     * 一个“快乐数”定义为：对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和，然后重复这个过程直到这个数变为 1，也可能是无限循环但始终变不到 1。如果可以变为 1，那么这个数就是快乐数。
     *
     * 示例: 
     *
     * 输入: 19
     * 输出: true
     * 解释:
     * 12 + 92 = 82
     * 82 + 22 = 68
     * 62 + 82 = 100
     * 12 + 02 + 02 = 1
     */

    public static void main(String[] args) {
        System.out.println(isHappy(0));
        System.out.println(isHappy(1));
        System.out.println(isHappy(2));
        System.out.println(isHappy(19));
    }

    //自己的解法：使用hash表统计是否循环
    public static boolean isHappy(int n) {
        Map<Integer,Integer> map=new HashMap<>();
        while (n!=1){
            int sum=0;
            int value=n;
            while (value!=0){
                int tmp=value%10;
                sum+=tmp*tmp;
                value=value/10;
            }
            if(map.get(sum)==null){
                map.put(sum,sum);
            }else{
                return false;
            }
            n=sum;
        }
        return true;
    }

    //官方解法：快慢指针，执行1遍和执行2遍
    public static boolean isHappyOffice(int n) {
        int slow = n, fast = n;
        do{
            slow = bitSquareSum(slow);
            fast = bitSquareSum(fast);
            fast = bitSquareSum(fast);
        }while(slow != fast);

        return slow == 1;
    }

    //计算平方数
    public static int bitSquareSum(int n) {
        int sum = 0;
        while(n > 0)
        {
            int bit = n % 10;
            sum += bit * bit;
            n = n / 10;
        }
        return sum;
    }

}